#!/usr/bin/env python3
"""
任务 3: 扩展 main.py 添加命令行参数解析
文件: main.py (修改现有)
实现 parse_arguments() 函数处理命令行参数
支持 --directory, --include, --exclude, --verbose, --dry-run 等参数
实现 validate_args() 函数验证参数有效性
"""

import argparse
import sys
import os
from pathlib import Path

def parse_arguments() -> argparse.Namespace:
    """
    解析命令行参数
    
    Returns:
        argparse.Namespace: 解析后的参数对象
    """
    parser = argparse.ArgumentParser(
        description="git_pull_all - 批量更新 Git 仓库工具",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例用法:
  %(prog)s                                    # 更新当前目录及其子目录中的所有 Git 仓库
  %(prog)s --directory /path/to/projects      # 更新指定目录中的 Git 仓库
  %(prog)s --include "*project*" --exclude "*test*"  # 只包含包含"project"的仓库，排除包含"test"的仓库
  %(prog)s --verbose --dry-run               # 详细输出并预览模式（不实际执行）
        """
    )
    
    # 必需参数
    parser.add_argument(
        "directory",
        nargs="?",
        default=".",
        help="要扫描的根目录路径（默认：当前目录）"
    )
    
    # 可选参数
    parser.add_argument(
        "--include",
        action="append",
        default=[],
        help="包含的路径模式（可多次使用），支持通配符"
    )
    
    parser.add_argument(
        "--exclude",
        action="append",
        default=[],
        help="排除的路径模式（可多次使用），支持通配符"
    )
    
    parser.add_argument(
        "--verbose", "-v",
        action="store_true",
        help="启用详细输出模式"
    )
    
    parser.add_argument(
        "--dry-run",
        action="store_true",
        help="预览模式，不实际执行 git pull"
    )
    
    parser.add_argument(
        "--timeout",
        type=int,
        default=300,
        help="命令执行超时时间（秒，默认：300）"
    )
    
    parser.add_argument(
        "--max-workers",
        type=int,
        default=4,
        help="最大并发数（默认：4）"
    )
    
    # 解析参数
    args = parser.parse_args()
    
    return args

def validate_args(args: argparse.Namespace) -> bool:
    """
    验证命令行参数有效性
    
    Args:
        args: 解析后的参数对象
        
    Returns:
        bool: 参数是否有效
    """
    try:
        # 验证目录路径
        directory = Path(args.directory)
        if not directory.exists():
            print(f"错误：目录不存在: {args.directory}")
            return False
        
        if not directory.is_dir():
            print(f"错误：路径不是目录: {args.directory}")
            return False
        
        # 验证超时时间
        if args.timeout <= 0:
            print(f"错误：超时时间必须大于 0: {args.timeout}")
            return False
        
        # 验证最大并发数
        if args.max_workers <= 0:
            print(f"错误：最大并发数必须大于 0: {args.max_workers}")
            return False
        
        # 验证包含模式
        for pattern in args.include:
            if not pattern.strip():
                print(f"错误：包含模式不能为空: {pattern}")
                return False
        
        # 验证排除模式
        for pattern in args.exclude:
            if not pattern.strip():
                print(f"错误：排除模式不能为空: {pattern}")
                return False
        
        return True
        
    except Exception as e:
        print(f"参数验证失败: {str(e)}")
        return False

def print_usage_info():
    """打印使用信息"""
    print("git_pull_all - 批量更新 Git 仓库工具")
    print("用法:")
    print("  python git_pull_all-task-3.py [选项]")
    print("")
    print("选项:")
    print("  directory           要扫描的根目录路径（默认：当前目录）")
    print("  --include PATTERN   包含的路径模式（可多次使用）")
    print("  --exclude PATTERN   排除的路径模式（可多次使用）")
    print("  --verbose, -v       启用详细输出模式")
    print("  --dry-run          预览模式，不实际执行 git pull")
    print("  --timeout SECONDS   命令执行超时时间（秒）")
    print("  --max-workers N    最大并发数")
    print("")
    print("示例:")
    print("  python git_pull_all-task-3.py")
    print("  python git_pull_all-task-3.py /path/to/projects")
    print("  python git_pull_all-task-3.py --include \"*project*\" --exclude \"*test*\"")

def test_argument_parsing():
    """测试参数解析功能"""
    print("测试参数解析功能...")
    
    # 测试正常参数
    test_args = [
        "directory",
        "--include", "*project*",
        "--include", "*repo*",
        "--exclude", "*test*",
        "--verbose",
        "--dry-run",
        "--timeout", "600",
        "--max-workers", "2"
    ]
    
    print(f"测试参数: {test_args}")
    args = parse_arguments()
    print(f"解析结果: {args}")
    
    # 测试参数验证
    is_valid = validate_args(args)
    print(f"参数验证结果: {is_valid}")
    
    # 测试无效参数
    invalid_args = ["nonexistent_directory"]
    sys.argv = ["git_pull_all-task-3.py"] + invalid_args
    try:
        args = parse_arguments()
        is_valid = validate_args(args)
        print(f"无效参数测试结果: {is_valid}")
    except SystemExit:
        print("无效参数测试：正确退出")

if __name__ == "__main__":
    test_argument_parsing()